package tasks.leetcode.oj;

import java.util.Arrays;

public class MaxAndMinNSum {

    /**
     * 求最大N个数和最小N个数的和（不能重复选择）
     *
     * @param arr 数组
     * @param N   选择个数
     * @return 最大和 + 最小和，若无法选出返回 -1
     */
    public static long solve(int[] arr, int N) {
        if (arr == null || arr.length < 2 * N) {
            return -1;
        }

        // 排序
        Arrays.sort(arr);

        long minSum = 0;
        long maxSum = 0;

        // 最小N个数：前N个
        for (int i = 0; i < N; i++) {
            minSum += arr[i];
        }

        // 最大N个数：后N个
        for (int i = arr.length - N; i < arr.length; i++) {
            maxSum += arr[i];
        }

        return minSum + maxSum;
    }

    // 测试
    public static void main(String[] args) {
        // 测试用例1
        int[] arr1 = {1, 2, 3, 4, 5};
        int N1 = 2;
        System.out.println(solve(arr1, N1)); // 1+2 + 4+5 = 3+9 = 12

        // 测试用例2
        int[] arr2 = {1, 2, 3, 4, 5};
        int N2 = 3;
        System.out.println(solve(arr2, N2)); // 1+2+3 + 3+4+5 = 6+12=18? 但3重复了！

        // 但数组长度=5, 2*3=6 > 5 → 不合法！
        // 所以上面 N=3 应该返回 -1

        int[] arr3 = {1, 2, 3, 4, 5, 6};
        int N3 = 3;
        System.out.println(solve(arr3, N3)); // min:1+2+3=6, max:4+5+6=15, total=21

        // 测试用例4：长度不够
        int[] arr4 = {1, 2, 3};
        int N4 = 2;
        System.out.println(solve(arr4, N4)); // 2*2=4 > 3 → -1

        // 测试用例5：N=0
        int[] arr5 = {1, 2, 3, 4};
        int N5 = 0;
        System.out.println(solve(arr5, N5)); // 0 (0+0)
    }
}